//package com.ruoyi.web.controller.cs;
//
//import com.alibaba.fastjson.JSON;
//import com.ruoyi.common.annotation.Log;
//import com.ruoyi.common.constant.Constants;
//import com.ruoyi.common.core.controller.BasicsController;
//import com.ruoyi.common.core.domain.Response;
//import com.ruoyi.common.core.domain.entity.SysUser;
//import com.ruoyi.common.core.domain.model.LoginUser;
//import com.ruoyi.common.enums.BusinessType;
//import com.ruoyi.common.utils.GiftDTO;
//import com.ruoyi.common.utils.ServletUtils;
//import com.ruoyi.cs.domain.TBox;
//import com.ruoyi.cs.domain.TGoods;
//import com.ruoyi.cs.mapper.TBoxMapper;
//import com.ruoyi.cs.mapper.TGoodsMapper;
//import com.ruoyi.system.domain.SysConfig;
//import com.ruoyi.system.mapper.SysConfigMapper;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiImplicitParam;
//import io.swagger.annotations.ApiImplicitParams;
//import io.swagger.annotations.ApiOperation;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestMethod;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.math.BigDecimal;
//import java.util.*;
//
//@Api(tags = {"开箱测试"})
//@RestController
//@RequestMapping("/cs/boxopen")
//@SuppressWarnings("all")
//public class TBoxOpenTestController extends BasicsController {
//    private static final Logger log = LoggerFactory.getLogger(TBoxOpenTestController.class);
//    @Autowired
//    private TBoxMapper tBoxMapper;
//    @Autowired
//    private TGoodsMapper tGoodsMapper;
//    @Autowired
//    private SysConfigMapper sysConfigMapper;
//
//    @ApiOperation("开箱测试")
//    @RequestMapping(name="开箱测试",value="common/unpacking",method = RequestMethod.GET)
//    @ApiImplicitParams({
//            @ApiImplicitParam(name = "boxId",value = "箱子ID" , dataType = "String", paramType = "query", required = false),
//            @ApiImplicitParam(name = "num",value = "数量" , dataType = "Integer", paramType = "query", required = false),
//    })
//    public Response<Map> unpacking(String boxId, Integer num) {
//        try {
//            TBox tBox = tBoxMapper.selectTBoxById(boxId);
//            List<TGoods> goodsList = tGoodsMapper.boxGoodsList(Constants.GOOGSBLTYPE0, boxId);
//            BigDecimal jackpot = tBox.getJackpot() == null ? new BigDecimal(0) : tBox.getJackpot();
//            SysConfig jackpotProportion = sysConfigMapper.checkConfigKeyUnique("jackpot_increase_proportion");
//            String jackpotConfigValue = jackpotProportion.getConfigValue() == null ? "1" : jackpotProportion.getConfigValue();
//            Integer frontJackpotNum = tBox.getFrontJackpotNum() == null ? 5 : tBox.getFrontJackpotNum();
//            List<String> goodsTopN = tGoodsMapper.getGoodsTopN(tBox.getBoxId(), frontJackpotNum);
//
//            List<TGoodsVo> result = new ArrayList<>();
//            int numss = 0;
//            BigDecimal profit = new BigDecimal(0);
//            for(int cc=0;cc<num;cc++){
//                numss++;
//                /**获取该奖池下饰品*/
//                jackpot = jackpot.add(tBox.getBoxPrice().multiply(new BigDecimal(jackpotConfigValue)));
//                List<TGoods> lowGoodsList = new ArrayList<>();
//                for (TGoods tGoods : goodsList) {
//                    if (tGoods.getGoodsPrice().compareTo(jackpot)<=0){
//                        lowGoodsList.add(tGoods);
//                    }
//                }
//                if (lowGoodsList.size() == 0) {
//                    lowGoodsList = tGoodsMapper.lowestPriceGoods(boxId);
//                }
//                Collections.shuffle(lowGoodsList);
//                List<GiftDTO> giftDTOList = new ArrayList<>();
//                for (int i = 0; i < lowGoodsList.size(); i++) {
//                    GiftDTO giftDTO = new GiftDTO();
//                    giftDTO.setIndex(i);
//                    giftDTO.setNo(lowGoodsList.get(i).getGoodsId().toString());
//                    giftDTO.setName(lowGoodsList.get(i).getGoodsName());
//                    giftDTO.setProbability(lowGoodsList.get(i).getGoodsChance().doubleValue());
//                    giftDTOList.add(giftDTO);
//                }
//                Integer idex = GiftDTO.luckdraw(giftDTOList);
//                TGoods tGoods = lowGoodsList.get(idex);
//
//                profit = profit.add(tBox.getBoxPrice()).subtract(tGoods.getGoodsPrice());
//                /**获取的排名前N的饰品则清空奖池*/
//                boolean flag = goodsTopN.contains(tGoods.getGoodsId());
//                if (flag) {
//                    jackpot = tBox.getInitialJackpot();
//                }
//
//                long cou = result.stream().filter(bean -> bean.getGoodsId().equals(tGoods.getGoodsId())).count();
//                if (cou == 0){
//                    TGoodsVo tGoodsVo = new TGoodsVo();
//                    tGoodsVo.setGoodsId(tGoods.getGoodsId());
//                    tGoodsVo.setGoodsName(tGoods.getGoodsName());
//                    tGoodsVo.setNum(1);
//                    result.add(tGoodsVo);
//                }else {
//                    for (TGoodsVo tGoodsVo : result) {
//                        if(tGoodsVo.getGoodsId().equals(tGoods.getGoodsId())){
//                            tGoodsVo.setNum(tGoodsVo.getNum()+1);
//                        }
//                    }
//                }
//
//                if (numss%10000 == 0){
//                    log.info("普通用户开箱测试一轮结果:{}", JSON.toJSONString(result));
//                }
//            }
//            Map map = new HashMap();
//            map.put("饰品开出个数统计",result);
//            map.put("开箱总次数",num);
//            map.put("最终奖池",jackpot);
//            map.put("开箱利润",profit);
//            return Response.success(map);
//        } catch (Exception e) {
//            log.error("开箱异常:{}", e.getMessage());
//            return Response.fail(Constants.FAILCODE, e.getMessage());
//        }
//    };
//    class TGoodsVo{
//        private String goodsId;
//
//        private String goodsName;
//
//        private Integer num;
//
//        public String getGoodsId() {
//            return goodsId;
//        }
//
//        public void setGoodsId(String goodsId) {
//            this.goodsId = goodsId;
//        }
//
//        public String getGoodsName() {
//            return goodsName;
//        }
//
//        public void setGoodsName(String goodsName) {
//            this.goodsName = goodsName;
//        }
//
//        public Integer getNum() {
//            return num;
//        }
//
//        public void setNum(Integer num) {
//            this.num = num;
//        }
//    }
//}
